package com.example.demo.day0304;

public class ProductorAndCustomer {
    public static void main(final String[] args) {
         final Clerk clerk = new Clerk();//创建一个Clerk类型的对象clerk
         //消费时不生产，生产时不消费

        new Thread(new Runnable() {//new一个生产者线程
            public void run() {//实现run方法
                synchronized (clerk){//给clerk对象的代码块加上同步锁
                    while(true){//无限生产
                        if (clerk.productNum == 0){//产品数为0，开始生产
                            System.out.println("产品数为0，开始生产");
                            while (clerk.productNum < 4){
                                clerk.productNum++;
                                System.out.println("库存：" + clerk.productNum);
                            }
                            System.out.println("产品数为" + clerk.productNum + "，结束生产");
                            clerk.notify();//唤醒消费者线程
                        }else{
                            try {
                                //@todo wait 和sleep的区别
                                clerk.wait();//生产者线程等待

                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        },"生产者").start();//开始生产者线程
        new Thread(new Runnable() {//new一个生产者线程
            public void run() {//实现run方法
                synchronized (clerk){//给clerk对象的代码块加上同步锁
                    while(true){//无限消费
                        if (clerk.productNum == 4){//产品数为4，开始消费

                            System.out.println("产品数为4，开始消费");
                            while (clerk.productNum >0){
                                clerk.productNum--;
                                System.out.println("库存：" + clerk.productNum);
                            }
                            System.out.println("产品数为" + clerk.productNum + "，结束消费");
                            clerk.notify();//唤醒生产者线程
                        }else{
                            try {
                                clerk.wait();//消费者线程等待
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        },"消费者").start();//开始消费者线程

    }
}
class Clerk{
    public static int productNum = 0;
}
